﻿using System.ComponentModel.DataAnnotations;
using DotNetStar.OpenSDK.Payment;

namespace DotNetStar.OpenSDK.WeChat.Pay
{
    /// <summary>
    /// 微信支付退款申请。请求需要双向证书，https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3
    /// </summary>
    /// <remarks>
    /// 当交易发生之后一段时间内，由于买家或者卖家的原因需要退款时，卖家可以通过退款接口将支付款退还给买家，微信支付将在收到退款请求并且验证成功之后，按照退款规则将支付款按原路退到买家帐号上。
    /// 注意：
    /// 1、交易时间超过一年的订单无法提交退款；
    /// 2、微信支付退款支持单笔交易分多次退款，多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。申请退款总金额不能超过订单金额。 一笔退款失败后重新提交，请不要更换退款单号，请使用原商户退款单号。
    /// 3、请求频率限制：150qps，即每秒钟正常的申请退款请求次数不超过150次
    ///    错误或无效请求频率限制：6qps，即每秒钟异常或错误的退款申请请求不超过6次
    /// 4、每个支付订单的部分退款次数不能超过50次
    /// </remarks>
    /// <seealso cref="WeChatPayApiRequest{RefundApiResponse}" />
    public class RefundApiRequest : WeChatPayApiRequest<RefundApiResponse>
    {
        /// <summary>
        /// 初始化 <see cref="RefundApiRequest"/> 类的新实例。
        /// </summary>
        /// <param name="config">支付配置。</param>
        /// <param name="requestUrl">订单退款 api 地址。若使用了沙箱地址，可以传入沙箱地址的 url。</param>
        public RefundApiRequest(PaymentConfig config,string requestUrl= "https://api.mch.weixin.qq.com/secapi/pay/refund") : base(requestUrl, config)
        {
        }

        /// <summary>
        /// 微信生成的订单号，在支付通知中有返回。
        /// </summary>
        [StringLength(32)]
        public string Transaction_Id { get; set; }
        /// <summary>
        /// 商户系统内部的退款单号，商户系统内部唯一，只能是数字、大小写字母_-|*@ ，同一退款单号多次请求只退一笔。
        /// </summary>
        [Required,StringLength(64)]
        public string Out_Refund_No { get; set; }
        /// <summary>
        /// 订单总金额，单位为分，只能为整数。
        /// </summary>
        public int Total_Fee { get; set; }
        /// <summary>
        /// 退款总金额，订单总金额，单位为分，只能为整数。
        /// </summary>
        public int Refund_Fee { get; set; }
        /// <summary>
        /// 货币类型，符合ISO 4217标准的三位字母代码，默认人民币：CNY。
        /// </summary>
        public string Refund_Fee_Type { get; set; } = "CNY";
        /// <summary>
        /// 若商户传入，会在下发给用户的退款消息中体现退款原因。
        /// </summary>
        [StringLength(80)]
        public string Refund_Desc { get; set; }
        /// <summary>
        /// 仅针对老资金流商户使用
        /// REFUND_SOURCE_UNSETTLED_FUNDS---未结算资金退款（默认使用未结算资金退款）
        /// REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款
        /// </summary>
        [StringLength(30)]
        public string Refund_Account { get; set; } = "REFUND_SOURCE_UNSETTLED_FUNDS";
    }
}
